#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/wait.h>

#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    // 获取IPC键值
    key_t k1 = ftok("/home/disen/syscode", 2);
    if(k1==-1){
        perror("ftok");
        return -1;
    }

    // IPC_CREAT 表示如果k1对应的消息队列不存在，则创建，创建的权限为0644
    // 消息生命周期：系统级（重启系统时才会消亡）或手动删除
    int msgid = msgget(k1, IPC_CREAT|0644); // 获取或创建消息队列
    if(msgid == -1){
        perror("msgget");
        return -1;
    }
    // 系统的第一个消息队列的ID是0
    printf("msg id is %d\n", msgid);

    if(fork() == 0){
        // 子进程
        int data = 0;
        while(1){
            // msgtype 为0 表示按FIFO读取消息 
            msgrcv(msgid, &data, 4, 0, 0);
            printf("pid(%d) recv data: %d\n",getpid(), data);
            if(data == 9) break;
        }
        _exit(0);
    }

    // 父进程
    printf("父进程(pid=%d)正在向消息队列中发送数据...\n", getpid());
    int ret = 0;
    for(int i=1; i<10; i++){
        ret = msgsnd(msgid, &i, 4, 0); // 发送消息
        sleep(1);
    }

    wait(NULL);

    return 0;
}
